package Map.Map01;

import java.util.HashMap;
import java.util.Map;

/*
 * java.util.Map<k,v>
 *   Map集合的特点：
 *       1、Map集合是一个双列集合，一个元素包含两个值（一个key，一个value）
 *       2、Map集合中的元素，key和value的数据类型可以相同，也可以不同
 *       3、Map集合中的元素，key是不允许重复的，value是可以重复的
 *       4、Map集合中的元素，key和value是一一对应的
 * java.util.HashMap<k,v>集合 implements Map<k,v>接口
 *   HashMap集合的特点：
 *       1、底层是哈希表，查询速度快
 *           JDK1.8以后：数组+单链表/红黑树（链表长度超过8），用来提高查询速度
 *       2、HashMap集合是一个无序的集合，存储元素和取出元素的顺序有可能不一致
 * java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合
 *   LinkedHashMap集合的特点
 *       1、底层是哈希表+双链表（维持数据的顺序）
 *       2、他是一个有序的集合，存储元素和输出元素的顺序是一致的
 *   Map中的常用方法：
 *             public V put(K key, V value):  把指定的键与指定的值添加到Map集合中。
 *            public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除，返回被删除元素的值。
 *            public V get(Object key) 根据指定的键，在Map集合中获取对应的值。
 *            boolean containsKey(Object key)   判断集合中是否包含指定的键。
 *            public Set<K> keySet(): 获取Map集合中所有的键，存储到Set集合中。
 *            public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
 * */
public class Map01 {
    public static void main(String[] args) {
        methodRemove();
        System.out.println("----------------------------------------------");
        methodGet();
        System.out.println("----------------------------------------------");

        methodContainsKey();
        System.out.println("----------------------------------------------");

        methodput();
    }

    private static void methodRemove() {
        Map<String, Integer> map = new HashMap<>();
        map.put("张三", 20);
        map.put("李四", 21);
        map.put("王二", 22);
        map.put("赵六", 20);
        System.out.println(map);
        Integer remove = map.remove("张三");
        System.out.println(map);
        System.out.println("被删除的元素是张三。他的值为：" + remove);
    }

    private static void methodGet() {
        //public V get(Object key) 根据指定的键，在Map集合中获取对应的值，没有返回Null
        Map<String, Integer> map = new HashMap<>();
        map.put("张三", 20);
        map.put("李四", 21);
        map.put("王二", 22);
        map.put("赵六", 20);
        System.out.println(map);
        Integer integer1 = map.get("张三");
        Integer integer2 = map.get("张四");
        //虽然可以java中有自动拆箱，但是如果寻找的key不存在，就会出现空指针异常。
        //java.lang.NullPointerException
        //int integer3 = map.get("张四");

        System.out.println("张三为：" + integer1);
        System.out.println("张四为：" + integer2);

    }

    private static void methodContainsKey() {
        Map<String, Integer> map = new HashMap<>();
        map.put("张三", 20);
        map.put("李四", 21);
        map.put("王二", 22);
        map.put("赵六", 20);
        System.out.println(map);
        boolean containsKey1 = map.containsKey("张三");
        System.out.println("张三是否存在：" + containsKey1);
        boolean containsKey2 = map.containsKey("张四");
        System.out.println("张四是否存在：" + containsKey1);
    }

    private static void methodput() {
        Map<String, Integer> map = new HashMap<>();
        //使用put方法时，若指定的键(key)在集合中没有，则没有这个键对应的值，返回null，并把指定的键值添加到集合中；
        //若指定的键(key)在集合中存在，则返回值为集合中键对应的值（该值为替换前的值），并把指定键所对应的值，替换成指定的新值。
        map.put("张三", 20);
        map.put("李四", 21);
        map.put("王二", 22);
        map.put("赵六", 20);
        System.out.println(map);
    }
}
